#include <stdio.h>
#include <stdlib.h>
// step 1# 定义队列结构体 ：用动态数组存放数据 ，定义头尾指针
typedef struct {
    int *data;
    int size;
    int maxSize;
    int front;
    int rear;
} Queue;
// step 2# 创建一个队列 ：为动态数组、队列变量分配空间
// 初始化队列长度和头尾指针
 Queue *creatQueue(int maxSize) {
    Queue *queue = (Queue *)malloc(sizeof(Queue));
    queue->data = (int *)malloc(sizeof(int) * maxSize);
    queue->front = 0;
    queue->rear = 0;
    queue->size = 0;
    queue->maxSize = maxSize;
    return queue;
 }
// step 3# 入队 ： 把元素加入到动态数组中尾指针指向的位置
// 然后更新尾指针，如果是循环队列，尾指针采用取余运算移动，同时更新队列长度
 void enqueue(Queue *queue, int element) {
    queue->data[queue->rear] = element;
    queue->rear = (queue->rear + 1) % queue->maxSize;
    queue->size++;
 }
// step 4# 出队 ：把数组中头指针指向的元素返回，并且用取余运算移动头指针，同时更新队列长度
 int dequeue(Queue *queue) {
    int tmp = queue->data[queue->front];
    queue->front = (queue->front + 1) % queue->maxSize;
    queue->size--;
    return tmp;
 }
// step 5# 遍历队列 ：用一个辅助指针来指向队列的头指针所在的位置
// 然后根据队列的长度决定辅助指针移动的此时，从而实现遍历队列
void printQueue(Queue *queue) {
    for(int i = queue->front, j = 0; j < queue->size; i++, j++) {
        int curData = queue->data[queue->front];
        printf("%d", curData);
        queue->front = (queue->front + 1) % queue->maxSize;
    }
    queue->size = 0;
}
// step 6# 销毁队列 ：释放动态数组和队列变量
 void destoryQueue(Queue *queue) {
    free(queue->data);
    free(queue);
    return;
 }

 int main() {

    Queue *queue = creatQueue(5);
    enqueue(queue, 1);
    enqueue(queue, 2);
    enqueue(queue, 3);
    enqueue(queue, 4);
    enqueue(queue, 5);
    printQueue(queue);

    return 0;
 }